package com.wongoing.sys.shiro;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.realm.Realm;

/**
 * 功能说明：总shrio reaml判断
 * 修改说明：
 * @author 吴兆强
 * @date 2017年11月2日 上午11:42:52
 * @version V0.1
 */
public class ShiroMulityModularRealmAuthenticator extends ModularRealmAuthenticator{

	  @Override
	  protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken)
	            throws AuthenticationException {
	        // 判断getRealms()是否返回为空
	        assertRealmsConfigured();
	        // 强制转换回自定义的CustomizedToken
	        ShiroUserTypeUsernamePasswordToken token = (ShiroUserTypeUsernamePasswordToken) authenticationToken;
	        // 登录类型
	        String loginType = token.getUserType();
	        // 所有Realm
	        Collection<Realm> realms = getRealms();
	        // 登录类型对应的所有Realm
	        Collection<Realm> typeRealms = new ArrayList<Realm>();
	        for (Realm realm : realms) {
	            if (realm.getName().contains(loginType))
	                typeRealms.add(realm);
	        }
	        // 判断是单Realm还是多Realm
	        if (typeRealms.size() == 1)
	            return doSingleRealmAuthentication(typeRealms.iterator().next(), token);
	        else
	            return doMultiRealmAuthentication(typeRealms, token);
	    }

}
